/**
 * 富文本编辑器工具函数
 * 提供 wangEditor 编辑器的配置和工具函数
 */

import { shallowRef } from 'vue';
import { createEditor, createToolbar } from '@wangeditor/editor';
import type { IDomEditor, IEditorConfig, IToolbarConfig } from '@wangeditor/editor';
import { ElMessage } from 'element-plus';
import { uploadImage as uploadImageApi } from '@/api/upload';

/**
 * 创建编辑器引用对象
 * @returns 编辑器引用对象
 */
export const createEditorRef = () => {
  return shallowRef<IDomEditor>();
};

/**
 * 图片上传处理函数
 * @param file 上传的文件
 * @param insertFn 插入图片的回调函数
 * @param module 模块名称（可选）
 */
export const uploadImage = async (file: File, insertFn: Function, module?: string) => {
  try {
    const response: any = await uploadImageApi(file, module);
    console.log('图片上传响应:', response);
    
    // 根据后端返回的格式和响应拦截器处理，尝试多种可能的路径
    let imageUrl = null;
    
    if (response) {
      // 尝试直接访问 accessUrl（响应拦截器已处理）
      imageUrl = response.accessUrl;
      
      // 如果没有找到，尝试 data.accessUrl
      if (!imageUrl && response.data) {
        imageUrl = response.data.accessUrl;
      }
      
      // 如果还没找到，尝试其他可能的字段
      if (!imageUrl) {
        imageUrl = response.url || response.fileUrl || response.path;
      }
    }
    
    if (imageUrl) {
      let finalUrl = imageUrl.trim();
      
      // 如果是本地文件路径（以/files/开头但不是完整URL），需要确保能正确访问
      if (finalUrl.startsWith('/files/') && !finalUrl.startsWith('http')) {
        // 本地文件路径，通过代理访问
        console.log('检测到本地文件路径:', finalUrl);
      } else if (finalUrl.startsWith('http')) {
        // OSS完整URL路径
        console.log('检测到OSS完整URL路径:', finalUrl);
      }
      
      console.log('最终图片URL:', finalUrl);
      insertFn(finalUrl, file.name, finalUrl);
    } else {
      console.error('图片上传响应格式异常，未找到图片URL:', response);
      ElMessage.error('图片上传失败：响应中未找到图片URL');
    }
  } catch (error: any) {
    console.error('图片上传错误:', error);
    ElMessage.error('图片上传失败：' + (error.message || '未知错误'));
  }
};

/**
 * 获取标准编辑器配置
 * @param placeholder 占位符文本
 * @param module 模块名称（可选）
 * @returns 编辑器配置对象
 */
export const getEditorConfig = (placeholder: string = '请输入内容...', module?: string): Partial<IEditorConfig> => {
  return {
    placeholder,
    MENU_CONF: {
      uploadImage: {
        customUpload: (file: File, insertFn: Function) => uploadImage(file, insertFn, module),
        maxFileSize: 5 * 1024 * 1024, // 5M
        allowedFileTypes: ['image/*']
      }
    }
  };
};

/**
 * 获取选项编辑器配置（简化版）
 * @param placeholder 占位符文本
 * @param module 模块名称（可选）
 * @returns 选项编辑器配置对象
 */
export const getOptionEditorConfig = (placeholder: string = '请输入选项内容...', module?: string): Partial<IEditorConfig> => {
  return {
    placeholder,
    MENU_CONF: {
      uploadImage: {
        customUpload: (file: File, insertFn: Function) => uploadImage(file, insertFn, module),
        maxFileSize: 5 * 1024 * 1024, // 5M
        allowedFileTypes: ['image/*']
      }
    }
  };
};

/**
 * 获取标准工具栏配置
 * @returns 工具栏配置对象
 */
export const getToolbarConfig = (): Partial<IToolbarConfig> => {
  return {
    excludeKeys: ['group-video', 'fullScreen']
  };
};

/**
 * 获取选项工具栏配置（更简化版）
 * @returns 选项工具栏配置对象
 */
export const getOptionToolbarConfig = (): Partial<IToolbarConfig> => {
  return {
    excludeKeys: [
      'group-video', 'fullScreen', 'headerSelect', 'blockquote',
      'codeSelectLang', 'group-indent', 'todo', 'emotion'
    ]
  };
};

/**
 * 创建编辑器回调函数
 * @param editorRef 编辑器引用对象
 * @returns 编辑器创建回调函数
 */
export const createEditorCallback = (editorRef: any) => {
  return (editor: IDomEditor) => {
    editorRef.value = editor;
  };
};

/**
 * 销毁编辑器实例
 * @param editors 编辑器实例数组
 */
export const destroyEditors = (editors: (IDomEditor | null | undefined)[]) => {
  // 过滤掉null和undefined的编辑器
  const validEditors = editors.filter(editor => editor != null);
  
  // 安全地销毁每个编辑器实例
  validEditors.forEach(editor => {
    if (editor && typeof editor.destroy === 'function') {
      try {
        editor.destroy();
        console.log('编辑器实例已销毁');
      } catch (error) {
        console.warn('编辑器销毁错误:', error);
      }
    }
  });
};

/**
 * 重置编辑器引用
 * @param editorRefs 编辑器引用对象数组
 */
export const resetEditorRefs = (editorRefs: any[]) => {
  editorRefs.forEach(ref => {
    if (ref) {
      ref.value = null;
    }
  });
};